// 数组新建
new Array(['apple', 'banana']);

new Array(2)//[,,]
Array(2)//[,,]
Array.of(2) //[2]

Array.from('lagou') // ['l', 'a', 'g', 'o', 'u']

Array.from({ 0: 1, 1: 2, 2: 3, length: 3 }); // [1, 2, 3]

const map = new Map().set(1, 2).set(3, 4);
Array.from(map); // [[1, 2], [3, 4]]

const tmp = [1, 2, 3, 4, 5]
Array.from(tmp, (x) => x ** 2); [1, 4, 9, 16, 25]; // [1, 4, 9, 16, 25]
Array.from(tmp, function(x) { return x ** this.exponent }, { exponent: 2 }); // [1, 4, 9, 16, 25]

const newArr6 = Array.of(1, 2, 3, 4); // [1, 2, 3, 4]


// 数组空位 只有es6之后的方法会识别空位
const arrEmpty = [1,,,,5];
arrEmpty.map(() => 6); // [6,  empty × 3, 6];
for(const a of arrEmpty) {
    console.log(a === undefined);
} // false true true true false

Array(3) // [, , ,]
// 返回一个具有 3 个空位的数组。
// 空位不是undefined，一个位置的值等于undefined，依然是有值的。空位是没有任何值，in运算符可以说明这一点。
0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
// forEach(), filter(), reduce(), every() 和some()都会跳过空位。
// map()会跳过空位，但会保留这个值
// join()和toString()会将空位视为undefined，而undefined和null会被处理成空字符串

// forEach方法
[,'a'].forEach((x,i) => console.log(i)); // 1

// filter方法
['a',,'b'].filter(x => true) // ['a','b']

// every方法
[,'a'].every(x => x==='a') // true

// reduce方法
[1,,2].reduce((x,y) => x+y) // 3

// some方法
[,'a'].some(x => x !== 'a') // false

// map方法
[,'a'].map(x => 1) // [,1]

// join方法
[,'a',undefined,null].join('#') // "#a##"

// toString方法
[,'a',undefined,null].toString() // ",a,,"
// Array.from方法会将数组的空位，转为undefined
Array.from(['a',,'b'])
// [ "a", undefined, "b" ]
// 扩展运算符（...）也会将空位转为undefined。
// copyWithin()会连空位一起拷贝。
// fill()会将空位视为正常的数组位置。
// for...of循环也会遍历空位。
// entries()、keys()、values()、find()和findIndex()会将空位处理成undefined。



// 索引
const opts = [1, 2, 3]
console.log(opts.length); // 3
opts[99] = a;
console.log(opts.length); // 100

// 检测数组
if (opts instanceof Array) { /* */ } // 仅在只在1个全局上下文环境下出现;
if (Object.prototype.toString.call(opts) === '[object Array]') {  /* */ }
if (Array.isArray(opts)) { /* */ }

// 迭代器方法
const a = ['apple', 'banana'];
Array.from(a.keys()) // [0, 1]
Array.from(a.values()) // ['apple', 'banana']
Array.from(a.entries()) // [[0, 'apple'], [1, 'banana']]

// 复制
const tmp1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
tmp1.copyWithin(5) // [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
const tmp2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
tmp2.copyWithin(0, 5); // [5, 6, 7, 8, 9, 5, 6, 7, 8, 9]
const tmp3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
tmp3.copyWithin(4, 0, 3); // [0, 1, 2, 3, 0, 1, 2, 7, 8, 9]

// 填充
const tmp4 = [0, 0, 0, 0, 0]
tmp4.fill(5); // [5, 5, 5, 5, 5]
const tmp5 = [0, 0, 0, 0, 0]
tmp5.fill(6, 3) // [0 ,0, 0, 6, 6]

// 转换
const p1 = {
    toLocalString() {
        return 'a1'
    },
    toString() {
        return 'a2'
    }
}
const p2 = {
    toLocalString() {
        return 'b1'
    },
    toString() {
        return 'b2'
    }
}
const p = [p1, p2]
console.log(p); // a2, b2
console.log(p.toString()); // a2, b2
console.log(p.toLocalString()); // a1, b1

// 栈方法
// push
const tmp = [];
tmp.push('Golden');
tmp.push('Taobao'); // ['Golden', 'Taobao']
// pop
tmp.pop(); // Taobao

// 队列方法
// shift
const tmp = ['Alibaba', 'Taobao', 'AntFin'];
const i = tmp.shift(); // Alibaba
tmp.length // 2
// unshift
const count = tmp.unshift('Tmall', 'Flggy') // 5

// 排序
// reverse
const tmp = [1, 2, 3, 4, 5]
tmp.reverse(); // [5, 4, 3, 2, 1]
// sort
const tmp = [0, 1, 5, 10, 15]
tmp.sort() // [0, 1, 10, 15, 5
tmp.sort((a, b) => a < b ? 1 : a > b ? -1 : 0); // [15, 10, 5, 1, 0]

// 操作方法
// concat
const color1 = ['red', 'black'];
const color2 = ['yellow', 'blue']
const color3 = {
    0: 'pink',
    1: 'gray',
    length: 2,
    [Symbol.isConcatSpreadable]: false // 是否强制打平
}
color1.concat(color2) // ['red', 'black', 'yellow', 'blue']
color1.concat(color3) // ['red', 'black', ['pink', 'gray']]

// splice
const colors = ['red', 'green', 'blue']
let m = colors.splice(0, 1) // red
console.log(colors); // ['green', 'blue']

m = colors.splice(1, 0, 'yellow', 'orange');
console.log(colors); // ['green', 'yellow', 'orange', 'blue']
console.log(m); // [empty]

m = colors.splice(1, 1, 'red', 'gray')
console.log(colors); // ['green', 'red', 'gray', 'oragne', 'blue']
console.log(m); // ['yellow']

// 搜索
const tmp = [0, 1, 2, 1, 0];
tmp.indexOf(0); // 0
tmp.lastIndexOf(0); // 4
tmp.includes(0); // true

// 位置
const tmp = [2, 4, 5, 7, 9];
tmp.find((el, idx, arr) => el === 5) // 5
tmp.findIndex((el, idx, arr) => el === 5); // 2

// 迭代方法
// some/every 有一个满足条件/所有的都满足条件
const tmp = [0, 1, 2, 3, 4];
tmp.some((i) => i > 2) // true
tmp.every((i) => i > 2) // false

// 归并
const tmp = [1, 2, 3, 4, 5]
tmp.reduce((pre, cur) => pre + cur); // 15
// reduce/reduceRight 只有执行顺序不一样

